/**
 * Notes: 文件处理相关函数
 * Ver : CCMiniCloud Framework 2.7.1 ALL RIGHTS RESERVED BY cclinux0730 (wechat)
 * Date: 2022-02-05 04:00:00 
 */
const pageHelper = require('./page_helper.js');
const timeHelper = require('./time_helper.js');

async function openFile(fileNode) {

	let url = fileNode.path;
	let type = fileNode.type;
	let name = fileNode.name;

	let ext = url.toLowerCase().substring(url.lastIndexOf(".") + 1);

	if (ext == 'doc' || ext == 'docx' || ext == 'xls' || ext == 'xlsx' || ext == 'ppt' || ext == 'pptx' || ext == 'pdf') {
		openDoc(name, url, '.' + ext, true);
	}
	else if (type == 'image') {
		wx.previewImage({
			current: url, // 当前显示图片的http链接
			urls: [url]
		});
	}
	else if (type == 'video') {
		wx.previewMedia({
			current: 0, // 当前显示图片的http链接  
			sources: [{
				url: url, // 需要预览的视频http链接列表  
				type: 'video'
			}]
		}) 
	}
	else
		pageHelper.showModal('不支持预览此文件');
}

// directName:是否用name作为文件名
async function openDoc(name, url, ext = '.xlsx', directName = false) {
	if (!url.includes('cloud://') && (url.includes('tmp') || url.includes('temp') || url.includes('wxfile'))) {
		// 本地临时文件直接打开
		wx.openDocument({
			showMenu: true,
			filePath: url,
			success: function (res) {
				console.log('打开文档成功');
			}
		});

		return;
	}

	else if (url.includes('cloud://')) {
		const cloudHelper = require('./cloud_helper.js');
		url = await cloudHelper.getTempFileURLOne(url);
	}


	wx.showLoading({
		title: '文件下载中',
	});

	let filePath = directName ? wx.env.USER_DATA_PATH + '/' + name : wx.env.USER_DATA_PATH + '/' + name + timeHelper.time('YMDhms') + ext;
	wx.downloadFile({
		url,
		//fileID:' ',
		filePath,
		success: function (res) {
			wx.hideLoading();
			if (res.statusCode != 200)
				return pageHelper.showModal('打开文件失败，请重试或者采取别的下载方式');

			const filePath = res.filePath;
			wx.openDocument({
				showMenu: true,
				filePath: filePath,
				success: function (res) {
					console.log('打开文档成功');
				}
			})
		},
		fail: function (err) {
			wx.hideLoading();
			console.log(err);
			pageHelper.showModal('打开文件失败，请重试或者采取别的下载方式');
		}
	})
}

/**
 * 文件操作辅助类
 * 提供文件相关的辅助功能
 */

class FileHelper {
	/**
	 * 获取文件扩展名
	 * @param {String} fileName 文件名
	 * @returns {String} 文件扩展名（小写）
	 */
	static getFileExt(fileName) {
		if (!fileName) return '';
		
		const lastDot = fileName.lastIndexOf('.');
		if (lastDot === -1) return '';
		
		return fileName.substring(lastDot + 1).toLowerCase();
	}
	
	/**
	 * 格式化文件大小
	 * @param {Number} size 文件大小（字节）
	 * @returns {String} 格式化后的文件大小
	 */
	static formatFileSize(size) {
		if (!size) return '0 B';
		
		const units = ['B', 'KB', 'MB', 'GB', 'TB'];
		let index = 0;
		let fileSize = size;
		
		while (fileSize >= 1024 && index < units.length - 1) {
			fileSize /= 1024;
			index++;
		}
		
		return fileSize.toFixed(2) + ' ' + units[index];
	}
	
	/**
	 * 检查文件大小是否超过限制
	 * @param {Number} fileSize 文件大小（字节）
	 * @param {Number} maxSize 最大限制（MB）
	 * @returns {Boolean} 是否超过限制
	 */
	static checkFileSize(fileSize, maxSize = 10) {
		if (!fileSize) return false;
		
		// 转换MB为字节
		const maxBytes = maxSize * 1024 * 1024;
		
		return fileSize > maxBytes;
	}
	
	/**
	 * 检查文件类型是否为图片
	 * @param {String} fileName 文件名
	 * @returns {Boolean} 是否为图片
	 */
	static isImageFile(fileName) {
		const ext = this.getFileExt(fileName);
		const imageTypes = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'];
		
		return imageTypes.includes(ext);
	}
	
	/**
	 * 检查文件类型是否为文档
	 * @param {String} fileName 文件名
	 * @returns {Boolean} 是否为文档
	 */
	static isDocFile(fileName) {
		const ext = this.getFileExt(fileName);
		const docTypes = ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf', 'txt'];
		
		return docTypes.includes(ext);
	}
	
	/**
	 * 检查文件类型是否为音频
	 * @param {String} fileName 文件名
	 * @returns {Boolean} 是否为音频
	 */
	static isAudioFile(fileName) {
		const ext = this.getFileExt(fileName);
		const audioTypes = ['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a'];
		
		return audioTypes.includes(ext);
	}
	
	/**
	 * 检查文件类型是否为视频
	 * @param {String} fileName 文件名
	 * @returns {Boolean} 是否为视频
	 */
	static isVideoFile(fileName) {
		const ext = this.getFileExt(fileName);
		const videoTypes = ['mp4', 'avi', 'mov', 'wmv', 'flv', 'mkv'];
		
		return videoTypes.includes(ext);
	}
	
	/**
	 * 获取文件图标
	 * @param {String} fileName 文件名
	 * @returns {String} 文件图标路径
	 */
	static getFileIcon(fileName) {
		const ext = this.getFileExt(fileName);
		
		// 根据文件类型返回不同图标
		if (this.isImageFile(fileName)) {
			return '/images/file_img.png';
		} else if (ext === 'pdf') {
			return '/images/file_pdf.png';
		} else if (['doc', 'docx'].includes(ext)) {
			return '/images/file_doc.png';
		} else if (['xls', 'xlsx'].includes(ext)) {
			return '/images/file_excel.png';
		} else if (['ppt', 'pptx'].includes(ext)) {
			return '/images/file_ppt.png';
		} else if (['zip', 'rar', '7z'].includes(ext)) {
			return '/images/file_zip.png';
		} else if (this.isVideoFile(fileName)) {
			return '/images/file_video.png';
		} else if (this.isAudioFile(fileName)) {
			return '/images/file_audio.png';
		} else {
			return '/images/file_other.png';
		}
	}
}

module.exports = {
	openDoc,
	openFile,
	FileHelper
}